package com.commons.dbutils.dao;

import java.util.List;

public interface IDAO extends ISQLDAO {

	/**
	 * 保存实体对象.
	 * 
	 * @param entity
	 *            对象
	 * @return ID
	 */
	public <T> int insert(T entity) throws Exception;

	/**
	 * 更新实体对象.
	 * 
	 * @param entity
	 *            对象
	 */
	public <T> int update(T entity) throws Exception;

	/**
	 * 更新实体对象通过id.
	 * 
	 * @param entity
	 *            对象
	 */
	public <T> int  updateById(T entity, Object id)
			throws Exception;

	/**
	 * 更新实体对象多个列
	 * 
	 * @param entity
	 *            对象
	 */
	public <T> int updateByColumns(T entity,String condition, Object[] value)
			throws Exception;

	/**
	 * 根据ID删除实体对象.
	 * 
	 * @param id
	 *            记录ID
	 */
	public int deleteById(Class<?> className, Object id) throws Exception;

	/**
	 * 根据ID数组删除实体对象.
	 * 
	 * @param ids
	 *            ID数组
	 */
	public int deleteByIDS(Class<?> className, Object[] ids) throws Exception;

	/**
	 * 根据ID获取实体对象.
	 * 
	 * @param id
	 *            记录ID
	 * @return 实体对象
	 */
	public <T> T get(Class<T> className, Object id) throws Exception;

	/**
	 * 根据ID数组获取实体对象集合.
	 * 
	 * @param ids
	 *            ID对象数组
	 * 
	 * @return 实体对象集合
	 */
	public <T> List<T> getListByIds(Class<T> className, Object[] ids)
			throws Exception;

	/**
	 * 根据属性名和属性值获取实体对象.
	 * 
	 * @param propertyName
	 *            属性名称
	 * @param value
	 *            属性值
	 * @return 实体对象
	 */
	public <T> T get(Class<T> className, String propertyName, Object value)
			throws Exception;

	/**
	 * 根据属性名和属性值获取实体对象集合.
	 * 
	 * @param propertyName
	 *            属性名称
	 * @param value
	 *            属性值
	 * @return 实体对象集合
	 */
	public <T> List<T> getList(Class<T> className, String propertyName,
			Object value) throws Exception;

	/**
	 * 获取所有实体对象集合.
	 * 
	 * @return 实体对象集合
	 */
	public <T> List<T> getAll(Class<T> className) throws Exception;

	/**
	 * 获取所有实体对象总数.
	 * 
	 * @return 实体对象总数
	 */
	public long getTotalCount(Class<?> className) throws Exception;

	/**
	 * 根据类和查询条件查询
	 * 
	 * @param className
	 * @param param 查询条件如：a=? and b=?
	 * @param value[]
	 * @return
	 */
	public long getTotalCount(Class<?> className, String param,Object[] value)
			throws Exception;

	

	/**
	 * 根据属性名判断数据是否已存在.
	 * 
	 * @param propertyName
	 *            属性名称
	 * @param value
	 *            值
	 * @return boolean
	 */
	public boolean isExist(Class<?> className, String propertyName, Object value)
			throws Exception;

	/**
	 * 
	 * @param clazz
	 *            类型
	 * @param condition
	 *            查询条件 a=? and b=?
	 * @param condition_values
	 * 			  查询条件值
	 * @param columns
	 *            查询列
	 * @param page
	 *            页号
	 * @param pageSize
	 *            显示数量
	 * @param orderBy
	 *            排序
	 * @return
	 * @throws Exception
	 */
	public <T> List<T> getListByPage(Class<T> clazz, String condition,Object[] condition_values,String columns, int page, int pageSize, String orderBy) throws Exception;

	
	
}
